package com.leshowski.agendaUCV2.comun;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.leshowski.agendaUCV2.fabrica.AgendaUCWebFabrica;
import com.leshowski.agendaUCV2.fabrica.AgendaUCXmlFabrica;
import com.leshowski.agendaUCV2.modelo.EventoAgenda;
import com.leshowski.agendaUCV2.modelo.Fecha;

public class ManejaEventosAgenda {
	
	private String rutaXML = null;
	private ArrayList<EventoAgenda> listaEventos = null;
	private int nroSecuencia = 0;
	private Fecha fechaActual = null;
	
	private Logger log = null;
	
	public ManejaEventosAgenda(String rutaXML,String rutaPropertiesLog4j){
		
		log = Logger.getLogger(ManejaEventosAgenda.class);
		PropertyConfigurator.configure(ManejaEventosAgenda.class.getClassLoader().getResource(rutaPropertiesLog4j));
		
		//inicializa la fecha al d�a de hoy
		fechaActual = obtieneFechaActual();
		this.rutaXML = rutaXML;
	}
	
	public EventoAgenda obtieneEventoApublicar() throws Exception{
		
		EventoAgenda eventoAgenda = null;
		
		//Se obtiene la fecha de la lista de Eventos almacenada en XML. Si no existe el XML
		//la fecha del XML viene vac�a
		Fecha fechaListaEventos = null;
		try{
			fechaListaEventos = AgendaUCXmlFabrica.obtieneFechaListaEventos(rutaXML);	
		}catch(Exception e){
			log.error("Error al obtener la fecha desde el XML. "+e);
			throw e;
		}
		
		//2-Obtener XML que almacena la info
		try{
			//Si el XML no existe o la fecha actual con la fecha del XML no coincide, se genera el XML
			if(!AgendaUCXmlFabrica.existeArchivoXML(rutaXML) || !fechaActual.compara(fechaListaEventos)){
				
				//3-Si no existe el XML, o las fechas son distintas, cargar
				//los eventos desde la pagina de la UC, pasarlos al XML y obtenerlo.
				
				//Carga agenda UC desde la Web
				listaEventos = AgendaUCWebFabrica.retornaAgendaUC(fechaActual);
				
				//Graba la informacion de los eventos en el XML
				AgendaUCXmlFabrica.generaXML(rutaXML,fechaActual, listaEventos,true/*genera por primera vez*/,1);
			}
			
		}catch(Exception e){
			log.error("Error al querer generar el XML por primera vez. "+e);
			throw e;
		}
		
		//4-Obtener numero de Secuencia
		try{
			nroSecuencia = AgendaUCXmlFabrica.obtieneNroSecuenciaListaEventos(rutaXML);
		}catch(Exception ex){
			log.error("Error al obtener el n�mero de secuencia de la lista de eventos en el XML. "+ex);
			throw ex;
		}
		
		//obtiene la lista de eventos desde el XML
		try{
			listaEventos = AgendaUCXmlFabrica.cargaXML(rutaXML);	
		}catch(Exception e){
			log.error("Error al cargar el XML de la agendaUC. "+e);
			throw e;
		}
		
		//5-Obtener evento Marcado
		try{
			eventoAgenda = AgendaUCXmlFabrica.cargaEventoMarcado(listaEventos);	
		}catch(Exception e){
			log.error("Error al obtener el evento a publicar. "+e);
			throw e;
		}
		
		return eventoAgenda;
	}
	
	public void actualizaXMLEventosAgenda() throws Exception{
		
		//7-Marcar siguiente Evento como el elejido
		
		//Deja marcado el siguiente evento en la lista de Eventos del XML
		try{
			nroSecuencia = AgendaUCXmlFabrica.elijeSiguienteEvento(listaEventos,nroSecuencia);
		}catch(Exception e){
			log.error("Error al marcar el siguiente evento en el XML. "+e);
			throw e;
		}
		
		//Graba la informacion de los eventos en el XML, indicando que no es primera vez que se genera el XML
		try{
			AgendaUCXmlFabrica.generaXML(rutaXML,fechaActual, listaEventos,false,/*grabaPrimeraVez,*/nroSecuencia);	
		}catch(Exception e){
			log.error("Error al grabar los eventos actualizados en el XML. "+e);
			throw e;
		}	
	}
	
	private Fecha obtieneFechaActual(){
	
		Calendar c = new GregorianCalendar();
		return new Fecha(Integer.toString(c.get(Calendar.DATE)),
				         Integer.toString(c.get(Calendar.MONTH)+1),
				         Integer.toString(c.get(Calendar.YEAR)));
	}

	public int getNroSecuencia() {
		return nroSecuencia;
	}

	public void setNroSecuencia(int nroSecuencia) {
		this.nroSecuencia = nroSecuencia;
	}

	public Fecha getFechaActual() {
		return fechaActual;
	}

	public void setFechaActual(Fecha fechaActual) {
		this.fechaActual = fechaActual;
	}
}
